﻿/*======================================================================
== Copyright : BlueCurve (c)
== Licence   : Gnu/GPL v2.x
== Author    : Teddy Albina
== Email     : bluecurveteam@gmail.com
== Web site  : http://www.codeplex.com/BlueCurve
========================================================================*/
using System;
using System.Net;
using BlueCurve.DownloadAttributes;
using System.Security.Cryptography.X509Certificates;
using BlueCurve.EnumAction;

namespace BlueCurve.WebCrawlerRequest
{
    /// <summary>
    /// Définit le protocol utilisé par une requete
    /// ou la ressource
    /// </summary>
    [Serializable]
    public enum RequestType
    {
        /// <summary>
        /// Protocol http
        /// </summary>
        http,
        /// <summary>
        /// Protocol ftp
        /// </summary>
        ftp,
        /// <summary>
        /// Protocol gopher
        /// </summary>
        gopher,
        /// <summary>
        /// Ressource type partage de fichier
        /// </summary>
        share,
        /// <summary>
        /// Ressource type ipc
        /// </summary>
        ipc
    }

    /// <summary>
    /// Définit l'état d'une requete
    /// </summary>
    [Serializable]
    public class RequestState
    {
        /// <summary>
        /// Type de caractère de la réponse
        /// </summary>
        public string CharacterSet { get; set; }
        /// <summary>
        /// Taille en octet du document
        /// </summary>
        public long ContentLength { get; set; }
        /// <summary>
        /// Type mime du document
        /// </summary>
        public string ContentType { get; set; }
        /// <summary>
        /// Headers associés à la réponse
        /// </summary>
        public WebHeaderCollection Headers { get; set; }
        /// <summary>
        /// Indique si le document proviens du cache
        /// </summary>
        public bool IsFromCache { get; set; }
        /// <summary>
        /// Date de dernière modification du document
        /// </summary>
        public DateTime LastModified { get; set; }
        /// <summary>
        /// Version du protocol HTTP utilisé dans la réponse
        /// </summary>
        public Version ProtocolVersion { get; set; }
        /// <summary>
        /// Uri de la ressource ayant répondu à la requête
        /// </summary>
        public Uri ResponseUri { get; set; }
        /// <summary>
        /// Statut de la réponse
        /// </summary>
        public HttpStatusCode StatusCode { get; set; }
        /// <summary>
        /// Statut de la réponse
        /// </summary>
        public FtpStatusCode ftpStatusCode { get; set; }
        /// <summary>
        /// Attributs attachés à la requete
        /// </summary>
        public Attributes Options { get; set; }
        /// <summary>
        /// Type de requête:
        /// http, gopher, ftp, 
        /// </summary>
        public RequestType TypeOffRequest { get; set; }
        /// <summary>
        /// Date de modification du document
        /// </summary>
        public DateTime CreationDate { get; set; }
        /// <summary>
        /// Action à effectuer sur le document
        /// </summary>
        public IndexAction Action { get; set; }
        /// <summary>
        /// Url de base de la requête
        /// </summary>
        public Uri Uri { get; set; }
        /// <summary>
        /// Extension du fichier
        /// </summary>
        public string Extension { get; set; }
        /// <summary>
        /// Nombre de téléchargements en // sur le serveur ftp
        /// </summary>
        public int FtpSimultaneousDownloads = -1;
        /// <summary>
        /// Données brutes
        /// </summary>
        private byte[] buffer = new byte[0];

        /// <summary>
        /// Définit le Buffer à une certaine valeur
        /// </summary>
        /// <param name="buff">Tableau de bytes</param>
        public void SetBuffer(byte[] buff)
        {
            this.buffer = buff;
        }

        /// <summary>
        /// Retourne le nuffer
        /// </summary>
        /// <returns></returns>
        public byte[] GetBuffer()
        {
            return this.buffer;
        }
    }
}